package com.rockcent.helper;

import com.rockcent.common.utils.ListSort;
import com.rockcent.mall.lib.dto.MenuTreeDTO;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Created by hone on 17-3-17.
 */
@Component
public class TreeHelper {
    /**
     * 通过列表生成树形菜单
     * @param list
     * @param parentId
     * @return
     */
    public List<MenuTreeDTO> getChildTreeObjects(List<MenuTreeDTO> list, Long parentId) {
        List<MenuTreeDTO> returnList = new ArrayList<MenuTreeDTO>();
        if(list!=null && list.size()>0) {
            for (Iterator<MenuTreeDTO> iterator = list.iterator(); iterator.hasNext(); ) {
                MenuTreeDTO res = (MenuTreeDTO) iterator.next();
                /**
                 * 判断第一个对象是否为第一个节点
                 *
                 */
                if (res.getParentId()!=null && parentId!=null && res.getParentId().longValue() == parentId.longValue()) {
                    returnList.add(res);
                }
            }
            sort(returnList);
            for(int j=0;j<returnList.size();j++) {
                MenuTreeDTO menuTreeDTO=returnList.get(j);
                if(hasChild(list,menuTreeDTO)) {
                    List<MenuTreeDTO> subMenuList = getChildList(list,menuTreeDTO);//二级
                    if(j==0) {
                        menuTreeDTO.setLink(subMenuList.get(0).getLink());
                    }
                    menuTreeDTO.setChildren(subMenuList);
                    for(int i=0;i<subMenuList.size();i++) {
                        MenuTreeDTO subMenu1=subMenuList.get(i);
                        if (hasChild(list, subMenu1)) {
                            List<MenuTreeDTO> subMenuList2 = getChildList(list,subMenu1);//三级
                            subMenu1.setLink(subMenuList2.get(0).getLink());
                            if(i==0) {
                                menuTreeDTO.setLink(subMenuList2.get(0).getLink());
                            }
                            subMenu1.setChildren(subMenuList2);
                            for(int k=0;k<subMenuList2.size();k++) {
                                MenuTreeDTO subMenu2=subMenuList2.get(k);
                                if (hasChild(list, subMenu2)) {
                                    subMenu2.setChildren(getChildList(list,subMenu2));
                                }
                            }
                        }
                    }
                }
            }
        }
        return returnList;
    }

    /**
     * 递归列表
     *
     */
    public void recursionFn(List<MenuTreeDTO> list, MenuTreeDTO t) {
        List<MenuTreeDTO> childsList=getChildList(list, t);
        /**
         * 设置他的子集对象集
         */
        t.setChildren(childsList);
        /**
         * 迭代--这些子集的对象--时候还有下一级的子级对象
         */
        for (MenuTreeDTO nextChild : childsList) {
            /**
             * 下一个对象，与所有的资源集进行判断
             */
            if(hasChild(list, nextChild)){

                /**
                 * 有下一个子节点,递归
                 */
                Iterator<MenuTreeDTO> it = childsList.iterator();
                while (it.hasNext()) {
                    MenuTreeDTO node = it.next();
                    /**
                     * 所有的对象--跟当前这个childsList 的对象子节点
                     */
                    recursionFn(list, node);
                }
            }
        }
    }

    /**
     * 获得指定节点下的所有子节点
     *
     */
    public List<MenuTreeDTO> getChildList(List<MenuTreeDTO> list, MenuTreeDTO t) {
        List<MenuTreeDTO> childsList=new ArrayList<MenuTreeDTO>();
        Iterator<MenuTreeDTO> it=list.iterator();
        while(it.hasNext()){
            MenuTreeDTO child=it.next();
            /**
             * 判断集合的父ID是否等于上一级的id
             */
            if(child.getParentId()!=null && t.getId()!=null && child.getParentId().longValue()==t.getId().longValue()){
                childsList.add(child);
            }
        }
        sort(childsList);
        return childsList;
    }

    /**
     * 判断是否还有下一个子节点
     *
     */
    public boolean hasChild(List<MenuTreeDTO> list, MenuTreeDTO t) {
        return getChildList(list, t).size() > 0 ? true : false;
    }

    /**
     * 菜单排序
     * @param menuTreeDTOList
     * @return
     */
    public List<MenuTreeDTO> sort(List<MenuTreeDTO> menuTreeDTOList) {
        ListSort<MenuTreeDTO> listSort = new ListSort<MenuTreeDTO>();
        listSort.sort(menuTreeDTOList,"getSort","asc");
        return menuTreeDTOList;
    }
}
